package list

import (
	"github.com/gofiber/fiber/v2"
	"sg-backend/global"
	"sg-backend/model/user"
)

/*
 * method  GET
 * path    /api/user/list
 */

// GetUserList GET请求，获取账号列表
func GetUserList(ctx *fiber.Ctx) error {

	// 获取请求参数
	keyword := ctx.Query("keyword")
	deptId := ctx.QueryInt("dept")
	isActive := ctx.QueryBool("isActive", true)
	pageSize := ctx.QueryInt("pageSize", 10)
	current := ctx.QueryInt("current", 1)

	// 获取并分页处理
	var users *[]user.User

	// 计算分页，mysql第一页为0计算
	offSet := (current - 1) * pageSize

	// 总数
	var total int64

	// 关键词匹配
	if len(keyword) != 0 {
		keyword = "%" + keyword + "%"

		// 1，有传入部门的情况下
		if deptId > 0 {

			// 1，计算总数
			r := global.DB.
				Where("is_active = ?", isActive).
				Where("username LIKE ?", keyword).
				Or("email LIKE ?", keyword).
				Or("mobile LIKE ?", keyword).
				Distinct().Model(&user.User{}).Count(&total)
			if r.Error != nil {
				return ctx.JSON(fiber.Map{
					"status":  "error",
					"message": "数据库查询出错！" + r.Error.Error(),
				})
			}

			// 2，分页处理
			if err := r.Offset(offSet).Limit(pageSize).Find(&users); err.Error != nil {
				return ctx.JSON(fiber.Map{
					"status":  "error",
					"message": "数据分页出错！" + err.Error.Error(),
				})
			}
		} else {

			// 没有传入部门，不按部门匹配
			r := global.DB.
				Where("is_active = ?", isActive).
				Where("username LIKE ?", keyword).
				Or("email LIKE ?", keyword).
				Or("mobile LIKE ?", keyword).
				Distinct().Model(&user.User{}).Count(&total)
			if r.Error != nil {
				return ctx.JSON(fiber.Map{
					"status":  "error",
					"message": "数据库查询出错！" + r.Error.Error(),
				})
			}

			// 2，分页处理
			if err := r.Offset(offSet).Limit(pageSize).Find(&users); err.Error != nil {
				return ctx.JSON(fiber.Map{
					"status":  "error",
					"message": "数据分页出错！" + err.Error.Error(),
				})
			}
		}

	} else {

		if deptId > 0 {

			// 传入了部门，按部门匹配全部数据，计算总数
			r := global.DB.
				Where("is_active = ?", isActive).
				Distinct().Model(&user.User{}).Count(&total)
			if r.Error != nil {
				return ctx.JSON(fiber.Map{
					"status":  "error",
					"message": "数据库查询出错！" + r.Error.Error(),
				})
			}

			// 分页处理
			if err := r.Offset(offSet).Limit(pageSize).Find(&users); err.Error != nil {
				return ctx.JSON(fiber.Map{
					"status":  "error",
					"message": "数据分页出错！" + err.Error.Error(),
				})
			}

		} else {

			//	不按部门匹配，获取全部数据
			r := global.DB.
				Where("is_active = ?", isActive).
				Distinct().Model(&user.User{}).Count(&total)
			if r.Error != nil {
				return ctx.JSON(fiber.Map{
					"status":  "error",
					"message": "数据库查询出错！" + r.Error.Error(),
				})
			}

			// 分页处理
			if err := r.Offset(offSet).Limit(pageSize).Find(&users); err.Error != nil {
				return ctx.JSON(fiber.Map{
					"status":  "error",
					"message": "数据分页出错！" + err.Error.Error(),
				})
			}
		}
	}

	// 查询结束返回结果
	return ctx.JSON(fiber.Map{
		"status":   "done",
		"success":  true,
		"message":  "请求成功！",
		"data":     users,
		"total":    total,
		"current":  current,
		"pageSize": pageSize,
	})
}
